我需要帮助,以改善我的C程序代码,以解决微分方程使用龙格库塔四阶方法
我需要一个c代码的帮助。代码实际上运行fyn,但我需要它做更多的工作。该程序是一个用龙格-库塔四阶方法求解微分方程组的程序。长话短说,我所需要的只是一种从接口输入问题的方法,而不是从代码内部输入。如果您有任何帮助,我们将不胜感激我需要帮助,以改善我的C程序代码,以解决微分方程使用龙格库塔四阶方法,c,runge-kutta,C,Runge Kutta,我需要一个c代码的帮助。代码实际上运行fyn,但我需要它做更多的工作。该程序是一个用龙格-库塔四阶方法求解微分方程组的程序。长话短说,我所需要的只是一种从接口输入问题的方法,而不是从代码内部输入。如果您有任何帮助,我们将不胜感激 #define X0 1.0 #define Xn 2.0 #define STEPLEN 10 #define Y1 1 //initial condition for y1 at x=0 #define Y2 0 //initial condition for y2
#define X0 1.0
#define Xn 2.0
#define STEPLEN 10
#define Y1 1 //initial condition for y1 at x=0
#define Y2 0 //initial condition for y2 at x=0
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
double f1(double x,double y1,double y2)
{
//a function to solve the functions 2 using x and y
return(y2);
}
double f2(double x,double y1,double y2)
{
//a function to solve the functions 1 using x and y
return(x*log(x) - (2*y1)/(x*x) + (2*y2)/x);
}
main()
{
double x,y1[STEPLEN],y2[STEPLEN];
double xmid,k1[2],k2[2],k3[2],k4[2],h = (double)(Xn - X0)/STEPLEN;
x = X0;
y1[0]=Y1;
y2[0]=Y2;
int i;
printf("This are the initial values. y1=%.10f y2=%.10f and h=%f\n\n", y1[0], y2[0],h);
//printf("x\t|k1\t|k2\t|k3\t|k4\t|y\n\n");
for(i=0; i<STEPLEN; i++){
k1[0]=h * f1(x,y1[i],y2[i]);
k1[1]=h * f2(x,y1[i],y2[i]);
xmid = x + h/2.0;
k2[0] = h * f1(xmid, y1[i] + k1[0] * 1/2.0, y2[i] + k1[1] * 1/2.0);
k2[1] = h * f2(xmid, y1[i] + k1[0] * 1/2.0, y2[i] + k1[1] * 1/2.0);
k3[0] = h * f1(xmid, y1[i] + k2[0] * 1/2.0, y2[i] + k2[1] * 1/2.0);
k3[1] = h * f2(xmid, y1[i] + k2[0] * 1/2.0, y2[i] + k2[1] * 1/2.0);
k4[0] = h * f1(x + h, y1[i] + k3[0] , y2[i] + k3[1]);
k4[1] = h * f2(x + h, y1[i] + k3[0] , y2[i] + k3[1]);
y1[i+1] = y1[i] + (k1[0] + 2*k2[0] + 2*k3[0] + k4[0])/6;
y2[i+1] = y2[i] + (k1[1] + 2*k2[1] + 2*k3[1] + k4[1])/6;
printf("When x=%f\n",x+h);
printf("k1 for y1=%.10f\n",k1[0]);
printf("k1 for y2=%.10f\n",k1[1]);
printf("k2 for y1=%.10f\n",k2[0]);
printf("k2 for y2=%.10f\n",k2[1]);
printf("k3 for y1=%.10f\n",k3[0]);
printf("k3 for y2=%.10f\n",k3[1]);
printf("k4 for y1=%.10f\n",k4[0]);
printf("k4 for y2=%.10f\n",k4[1]);
printf("y1 when x is %f=\t%.10f\n",x+h,y1[i+1]);
printf("y2 when x is %f=\t%.10f\n\n",x+h,y2[i+1]);
// printf("%f %f %f %f %f %f %f %f %f %f \n",k1[0],k1[1],k2[0],k2[1],k3[0],k3[1],k4[0],k4[1],y1[i+1],y2[i+1]);
x = x+h;
}
system("pause");
}
#定义X0 1.0
#定义XN2.0
#定义步骤10
#定义Y1//x=0时Y1的初始条件
#定义Y2 0//在x=0时Y2的初始条件
#包括
#包括
#包括
双f1(双x,双y1,双y2)
{
//用x和y解函数2的函数
回报率(y2);
}
双f2(双x,双y1,双y2)
{
//用x和y解函数1的函数
返回(x*log(x)-(2*y1)/(x*x)+(2*y2)/x);
}
main()
{
双x,y1[STEPLEN],y2[STEPLEN];
双xmid,k1[2],k2[2],k3[2],k4[2],h=(双)(Xn-X0)/STEPLEN;
x=X0;
y1[0]=y1;
y2[0]=y2;
int i;
printf(“这是初始值。y1=%.10f y2=%.10f和h=%f\n\n”,y1[0],y2[0],h);
//printf(“x\t | k1\t | k2\t | k3\t | k4\t | y\n\n”);
因为(i=0;i可以简单地
double X0, Xn;
fputs("Enter X0\n", stdout);
if (sscanf("%lf", &XO) != 1) Handle_EOForInputProblem();
fputs("Enter Xn\n", stdout);
if (sscanf("%lf", &Xn) != 1) Handle_EOForInputProblem();
...
或者创建一个助手函数来提示、处理用户I/O问题,并读入各种double
int Mayor_Read_Double(const char *prompt, double *dest) {
char buffer[100];
for (;;) {
fputs(prompt, stdout);
if (fgets(buffer, sizeof buffer, stdin) == NULL) {
return -1;
}
char *endptr;
errno = 0;
double number = strtod(buffer, &endptr);
if (errno && number != 0.0) {
fputs("Input out of range\n", stdout);
continue;
}
if (buffer == endptr) { // no conversion
fputs("Invalid input\n", stdout);
continue;
}
// Detect extra garbage
while (isspace((unsigned char) *endptr)) endptr++;
if (*endptr) {
fputs("Extra input\n", stdout);
continue;
}
*dest = number;
return 1;
}
}
double X0, Xn;
if (Mayor_Read_Double("Enter X0\n", &X0) != 1) return 0;
if (Mayor_Read_Double("Enter Xn\n", &Xn) != 1) return 0;
...
由于您知道如何使用printf
,您可能想使用函数。哇,很抱歉,因为您可以看到我的代码没有经验或高级,请您进一步解释或可能在代码中添加更多注释。谢谢。@Mayor使用第一种简单方法:提示输入1个变量,如X0
,在用户输入中扫描,检查scanf()
结果,以确保读取了双精度。对Xn
、Y1
、Y2
执行相同操作。