카테고리 없음

이온화 상수와 농도를 통한 농도 계산하기

송규 2023. 5. 31. 00:32

 

이번에 화학 하이탑을 풀때 이온화도와 이온화 상수의 관계를 이용해서 처음 농도와 이온화상수만을 통해 평형 농도에서의 계산을 통해 농도를 계산해봤었는데 이거를 C언어로 구현해봐야겠다고 생각이 들어서 진행해봤습니다.

일단 개념을 먼저 설명해드리겠습니다. 

 

여기서 나오는 개념이 이온화도, 이온화 상수, 강산, 약산 정도가 있습니다.

 

이온화도란 다음과 같이 정의됩니다.

이온화 상수는  산과 염기가 물에 녹아 이온화하여 평형상태를 이루었을 때 평형상수를 각각 산의 이온화 상수(Ka), 염기의 이온화 상수(Kb)라고 합니다.


다음과 같은 반응이 있다고 가정하고 이온화상수를 구하면 다음과 같이 나오는데 여기서 H2O는 용매로 사용되었기 때문에 물의 농도는 거의 변하지 않는 상수로 볼 수 있기 때문에 H2O는 제외하고 식을 써줍니다.

 

여기서 이온화 상수 Ka는 온도가 일정할때 산의 농도에 관계없이 항상 일정한 값이며, Ka가 크면 강산이고 Ka가 작으면 약산이라는 특징을 가집니다.


다음으로는 이온화도와 이온화 상수의 관계에 대해서 알려드리겠습니다.

 

HA + H2O = H3O+ + A-와 같은 반응이 있다고 가정하고 처음 용액의 농도를 C, 이온화도를 $\alpha$로 놓으면 이온화 상수 Ka를 다음과 같이 계산할 수 있습니다.


그런데 약산의 경우에는 $\alpha$의 값이 매우 작으므로 1-$\alpha\fallingdotseq1$ 입니다. 이를 이용해서 Ka를 구해보면

다음과 같이 이온화도를 정의할수 있고 이를 통해 H3O+의 농도를 구해보면 

다음과 같이 구할 수 있습니다.

 

그리고 강산일때도 구해보면 이렇게 나옵니다.

 

자 이제 개념 설명은 끝났고 코드에 대해서 말해드리겠습니다.

 

#include <stdio.h>
#include <math.h>
double a;
double calculate(double ion, double n) {
    
	double result;
    
    if (a==1) {
        // 강산일 때
        result =n;
    } else {
        // 약산일 때
        result = sqrt(ion*n);
    }
    
    return result;
}

int main() {
    double ion, n;  // ion: 이온화상수, n: 초기 몰농도
    char ian[1001]={}; 
    printf("강산이면 1, 약산이면 0을 입력하세요: ");
    scanf("%lf", &a);
    printf("이온화 상수를 입력하세요:ex) 1.0*10^x 형식으로 입력하세요 ");
    scanf("%s", ian);
    ion=(ian[0]-48)*10; // 26행부터 34행까지는 1.0*10^x 형식에 맞춰서 숫자를 나타내도록 해본 코드이다.
    ion+=(ian[2]-48);
    ion/=10;
    if(ian[7]!='-') // 지수가 -가 아닐때 
    {
    	if(ian[8]!=0)
   		ion*=pow(10, (((ian[7]-48)*10)+ian[8]-48)); // 배열의 7번째 자리 (지수)의 값에 따라 10을 곱해주는 횟수를 알려준다.
    	else
    	ion*=pow(10, (ian[7]-48));
	}
	else // 지수가 -일 때 
	{
		if(ian[9]!=0) 
   		ion/=pow(10, (((ian[8]-48)*10)+ian[9]-48)); 
    	else
    	ion/=pow(10, (ian[8]-48));
	}
	printf("%g", ion);
    printf("용액의 농도를 입력하세요: ");
    scanf("%lf", &n);
    double result = calculate(ion, n);
    printf("H3O+ 농도: %lf\n", result);
    
    return 0;
}

처음 짜본 코드인데 이 코드를 보면 26행부터 34행까지는 1.0*10^x 형식에 맞춰서 숫자를 나타내도록 하여 코드를 짜보았습니다.

 

이 코드에서 문제가 되는 점을 뽑자면 지수에 음수가 들어가면 계산을 못한다는 것이였어서 제가 다시 짜본 코드는 다음과 같습니다.

 

#include <stdio.h>
#include <math.h>
double a;
double calculate(double ion, double n) {
    
	double result;
    
    if (a==1) {
        // 강산일 때
        result =n;
    } else {
        // 약산일 때
        result = sqrt(ion*n);
    }
    
    return result;
}

int main() {
    double ion, n;  // ion: 이온화상수, n: 초기 몰농도
    char ian[1001]={}; 
    printf("강산이면 1, 약산이면 0을 입력하세요: ");
    scanf("%lf", &a);
    printf("이온화 상수를 입력하세요:ex) 1.0*10^x 형식으로 입력하세요 ");
    scanf("%s", ian);
    ion=(ian[0]-48)*10; // 26행부터 34행까지는 1.0*10^x 형식에 맞춰서 숫자를 나타내도록 해본 코드이다.
    ion+=(ian[2]-48);
    ion/=10;
    if(ian[7]!='-') // 지수가 -가 아닐때 
    {
    	if(ian[8]!=0)
   		ion*=pow(10, (((ian[7]-48)*10)+ian[8]-48)); // 배열의 7번째 자리 (지수)의 값에 따라 10을 곱해주는 횟수를 알려준다.
    	else
    	ion*=pow(10, (ian[7]-48));
	}
	else // 지수가 -일 때 
	{
		if(ian[9]!=0) 
   		ion/=pow(10, (((ian[8]-48)*10)+ian[9]-48)); 
    	else
    	ion/=pow(10, (ian[8]-48));
	}
	printf("%g", ion);
    printf("용액의 농도를 입력하세요: ");
    scanf("%lf", &n);
    double result = calculate(ion, n);
    printf("H3O+ 농도: %lf\n", result);
    
    return 0;
}

위 코드를 짜서 하이탑을 풀때 유용하게 이용할 수 있을거 같습니다. ^ - ^

이상으로 5월 정융탐을 마치겠습니다.  감사합니다.